/*实验心得：在这次变成过程中遇到了关于protected 
**方法问题，在访问时类对象仅仅可以访问类中的public
**修饰的方法，protected、provate修饰的方法是不可以
**访问到的。在继承的时候public继承到子类时依然是
**public修饰的。 
** 
**当private,public,protected作为继承方式时：

**对于公有继承方式： 
**(1)父类的public成员成为子类的public成员，允许类以外的代码访问这些成员；
**(2)父类的private成员仍旧是父类的private成员，子类成员不可以访问这些成员；
**(3)父类的protected成员成为子类的protected成员，只允许子类成员访问；

**(1) 基类成员对其对象的可见性： 

**公有成员可见，其他不可见。这里保护成员同于私有成员。 

(2) 基类成员对派生类的可见性： 

公有成员和保护成员可见，而私有成员不可见。这里保护成员同于公有成员。 

(3) 基类成员对派生类对象的可见性： 

公有成员可见，其他成员不可见。 

所以，在公有继承时，派生类的对象可以访问基类中的公有成员；派生类的成员函数可以访问基类中的公有成员和保护成员。这里，一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。 

对于私有继承方式： 

(1)父类的public成员成为子类的private成员，只允许子类成员访问；
(2)父类的private成员仍旧是父类的private成员，子类成员不可以访问这些成员；
(3)父类的protected成员成为子类的private成员，只允许子类成员访问；

(1) 基类成员对其对象的可见性： 

公有成员可见，其他成员不可见。 

(2) 基类成员对派生类的可见性： 

公有成员和保护成员是可见的，而私有成员是不可见的。 

(3) 基类成员对派生类对象的可见性： 

所有成员都是不可见的。 

所以，在私有继承时，基类的成员只能由直接派生类访问，而无法再往下继承。 

对于保护继承方式： 

(1)父类的public成员成为子类的protected成员，只允许子类成员访问；
(2)父类的private成员仍旧是父类的private成员，子类成员不可以访问这些成员；
(3)父类的public成员成为子类的protected成员，只允许子类成员访问；

这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言，对基类成员有不同的可见性。 

上述所说的可见性也就是可访问性。关于可访问性还有另的一种说法。这种规则中，称派生类的对象对基类访问为水平访问，称派生类的派生类对基类的访问为垂直访问。 

一般规则如下： 

公有继承时，水平访问和垂直访问对基类中的公有成员不受限制； 
私有继承时，水平访问和垂直访问对基类中的公有成员也不能访问； 
保护继承时，对于垂直访问同于公有继承，对于水平访问同于私有继承。
**
**
*****************************************/
#include<iostream>
#include<string>
using namespace std;

class People{
public:
    //////////////////无参构造函数 //////////////////
    People(){	
		name="李华";			
		height=175.0;
		weight=65.0;
		age=1;
		cout<<"People()......"<<endl;
	}
	
	//////////////////带参构造函数////////////////// 
	People(double hg,double wg):height(hg),weight(wg){
		name="李华";
		age=1;
		cout<<"People(String nm,double hg,double wg)......"<<endl;
	}
	
	People(string nm):name(nm){
		height=175.0;
		weight=65.0;
		age=1;
		cout<<"People(String nm)......"<<endl;
	}
	
	/////////////////析构函数////////////////////// 
	~People(){
		cout<<"~People()....."<<endl;
	}
	
	void ShowPeople();					//显示学生信息 
/*********内联函数******************** 
	void ShowPeople(){
		cout<<"姓名："<<this->name<<endl;
		cout<<"身高："<<this->height<<"\t体重："<<this->weight<<endl; 
	} 
*/
	void Grow(){
		this->age++;
	}

	string getName(){
		return name;
	}
	void setName(string name){
		this->name=name;
	}
	
	int getAge(){
		return this->age;
	}
	void setAge(int age){
		this->age=age;
	}
	
	double getHeight(){
		return this->height;
	}
	void setHeight(double height){
		this->height=height;
	}
	
	double getWeight(){
		return this->weight;
	}
	void setWeight(double weight){
		this->weight=weight;
	}
private:
	string name;					//姓名 
	double height;					//身高 
	double weight;					//体重 
	int age;						//年龄 
};

void People::ShowPeople(){
		cout<<"姓名："<<this->name<<"\t 年龄："<<this->age<<endl;
		cout<<"身高："<<this->height<<"\t体重："<<this->weight<<endl; 
	} 
int main(){
	People pp(32.0,34.0);
	pp.ShowPeople();
	People pe("王");
	pe.ShowPeople(); 
	pe.Grow();
	pe.ShowPeople();
	string str="wang";
	pe.setName(str);
	pe.ShowPeople();
	return 0;
}
 